import { createSlice } from '@reduxjs/toolkit'
import store from '..';
//创建一个切片对象，用于存储状态数据以及更改状态数据的动作方法
//以计数器为例
export let count = createSlice({   //需要传入一个配置对象
    //给这个状态数据相当于起了一个别名,这个参数是必填参数,参数值自定义，会自动追加到动作方法之前作为其别名
    name: 'counter',
    //定义初始化状态数据，值要求是一个对象，可以是数组对象，也可以是object对象
    initialState: {
        num: 100
    },
    //这个参数存储的就是所有的动作方法
    reducers: {
        //加法
        //所有的动作方法，都会传递两个参数
        //参数1表示状态数据,在redux的底层已经加密成了另一个对象，但是无妨碍我们直接获取操作它
        //参数2表示动作对象,但是一般情况下我们会直接从这个动作对象里面直接解构出payload载荷数据参数
        add: (state, { payload }) => {
            // console.log('状态数据', state);
            // console.log(state.num);
            // console.log('载荷数据', payload)
            state.num += payload;  //state.num = state.num + payload
        },
        //减法
        dec: (state, { payload }) => {
            state.num -= payload;  //state.num = state.num - payload
        }
    }
});

//使用切片对象中的动作方法，需要从这个切片对象的actions属性中进行解构
export let { add, dec } = count.actions;


export let asyncaddnum = payload => {
    //如果动作函数是需要处理异步请求的话，则这个方法要求返回一个函数
    //定时器、ajax请求
    //返回的是一个dispatch函数
    return dispatch => {
        // console.log(dispatch)
        //再函数的里面处理异步任务
        //要求：在1秒之后更新状态数据+1
        setTimeout(() => {
            //调用同步方法
            dispatch(add(payload));
        }, 800);
    }
}

export let asyncdecnum = n => {
    return dispatch => {
        setTimeout(() => {
            dispatch(dec(n))
        }, 1000)
    }
}

//暴露count变量
// export default count;

//如果想要直接暴露一个值 例如：字符串/数值/数组/对象 一般我们使用的默认暴露
//如果想要保留的是一个变量，则直接采用分别暴露 